package com.quyunshuo.module.home.dialog

import android.content.res.Configuration
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.viewbinding.ViewBinding
import com.quyunshuo.module.home.R
import me.jessyan.autosize.AutoSizeConfig

abstract class BaseDialog<T : ViewBinding> : DialogFragment() {

    private var _binding: T? = null
    protected val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = createViewBinding()
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        init(savedInstanceState)
    }
    abstract fun createViewBinding():T

    abstract fun init(savedInstanceState: Bundle?)

    override fun onStart() {
        super.onStart()
        dialog?.window?.let {
            val params = it.attributes
            params.width = getWidth()
            params.gravity = getGravity()
            params.height = getHeight()
            it.attributes = params

        }
        dialog?.setCancelable(cancel())
        dialog?.setCanceledOnTouchOutside(cancel())

    }

    open fun cancel():Boolean = false

    open fun getGravity(): Int{
         return Gravity.CENTER
     }

    open fun getWidth(): Int {
        return WindowManager.LayoutParams.MATCH_PARENT
    }

    open fun getHeight(): Int {
        return WindowManager.LayoutParams.WRAP_CONTENT
    }

    fun showAllowingStateLoss(manager: FragmentManager, tag: String?) {
        manager.beginTransaction().add(this, tag).commitAllowingStateLoss()
    }
    // 判断是否为平板设备
    protected open fun isTabletDevice(configuration: Configuration): Boolean {
        return configuration.smallestScreenWidthDp >= 600
    }
}
/*
package com.quyunshuo.module.home.dialog

import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.viewbinding.ViewBinding



/**
 * 自定义 DialogFragment 的抽象基类，使用 ViewBinding
 *
 * @param T ViewBinding 类型
 */
public abstract class BaseDialog<T : ViewBinding> : DialogFragment() {

    // ViewBinding 的引用，使用可空变量避免内存泄漏
    private var _binding: T? = null

    // 提供给子类使用的非空 ViewBinding 实例
    // 注意：只能在 onViewCreated 和 onDestroyView 之间安全使用
    protected val binding get() = _binding!!

    /**
     * 创建对话框视图
     *
     * @param inflater LayoutInflater 用于解析布局
     * @param container 父容器
     * @param savedInstanceState 保存的状态
     * @return 对话框的根视图
     */
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 调用抽象方法创建 ViewBinding 实例
        _binding = createViewBinding()
        // 返回 ViewBinding 的根视图
        return binding.root
    }

    /**
     * 视图创建完成后初始化
     *
     * @param view 已创建的视图
     * @param savedInstanceState 保存的状态
     */
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 调用子类实现的初始化方法
        init(savedInstanceState)
    }

    /**
     * 创建 ViewBinding 的抽象方法
     *
     * @return 子类必须返回 ViewBinding 的具体实现
     */
    abstract fun createViewBinding(): T

    /**
     * 初始化对话框
     *
     * @param savedInstanceState 保存的状态
     */
    abstract fun init(savedInstanceState: Bundle?)

    /**
     * 对话框显示前的设置
     */
    override fun onStart() {
        super.onStart()

        // 获取并配置对话框窗口
        dialog?.window?.let { window ->
            val params = window.attributes
            // 设置对话框宽度
            params.width = getWidth()
            // 设置对话框位置
            params.gravity = getGravity()
            // 设置对话框高度
            params.height = getHeight()
            // 应用修改后的参数
            window.attributes = params

            // 以下设置是固定的，可能会覆盖子类的自定义高度
            // 更好的做法是保留子类自定义的高度
            // params.height = WindowManager.LayoutParams.WRAP_CONTENT
        }

        // 设置对话框不可通过返回键取消
        dialog?.setCancelable(cancel())
        // 设置对话框不可通过点击外部区域取消
        dialog?.setCanceledOnTouchOutside(cancel())
    }

    open fun cancel():Boolean = false

    /**
     * 获取对话框位置（默认居中）
     *
     * @return 位置值（Gravity常量）
     */
    open fun getGravity(): Int {
        return Gravity.CENTER
    }

    /**
     * 获取对话框宽度（默认填满父容器）
     *
     * @return 宽度值（像素）
     */
    open fun getWidth(): Int {
        return WindowManager.LayoutParams.MATCH_PARENT
    }

    /**
     * 获取对话框高度（默认填满父容器）
     *
     * @return 高度值（像素）
     */
    open fun getHeight(): Int {
        return WindowManager.LayoutParams.MATCH_PARENT
    }

    /**
     * 安全显示对话框的方法（允许状态丢失）
     *
     * @param manager FragmentManager
     * @param tag 对话框标识
     */
    fun showAllowingStateLoss(manager: FragmentManager, tag: String?) {
        manager.beginTransaction()
            .add(this, tag)
            .commitAllowingStateLoss()
    }

    /**
     * 视图销毁时清理资源
     */
    override fun onDestroyView() {
        super.onDestroyView()
        // 清理 ViewBinding 引用，避免内存泄漏
        _binding = null
    }
}


 */